home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows 95 with MFC / Programming Windows 95 with MFC (Microsoft Programming Series)(097-0001465)(1996).iso / CODE / Chap02 / GdiDemo2 / GdiDemo2.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-05  |  6.2 KB  |  247 lines

  1. //***********************************************************************
  2. //
  3. //  GdiDemo2.cpp
  4. //
  5. //***********************************************************************
  6.  
  7. #include <afxwin.h>
  8. #include "GdiDemo2.h"
  9.  
  10. #define VHEIGHT (m_cyChar * 50)
  11.  
  12. CMyApp myApp;
  13.  
  14. /////////////////////////////////////////////////////////////////////////
  15. // CMyApp member functions
  16.  
  17. BOOL CMyApp::InitInstance ()
  18. {
  19.     m_pMainWnd = new CMainWindow;
  20.     m_pMainWnd->ShowWindow (m_nCmdShow);
  21.     m_pMainWnd->UpdateWindow ();
  22.     return TRUE;
  23. }
  24.  
  25. /////////////////////////////////////////////////////////////////////////
  26. // CMainWindow message map and member functions
  27.  
  28. BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd)
  29.     ON_WM_CREATE ()
  30.     ON_WM_PAINT ()
  31.     ON_WM_SIZE ()
  32.     ON_WM_VSCROLL ()
  33. END_MESSAGE_MAP ()
  34.  
  35. CMainWindow::CMainWindow ()
  36. {
  37.     m_nScrollPos = 0;
  38.     Create (NULL, "GdiDemo2", WS_OVERLAPPEDWINDOW | WS_VSCROLL);
  39. }
  40.  
  41. int CMainWindow::OnCreate (LPCREATESTRUCT lpcs)
  42. {
  43.     if (CFrameWnd::OnCreate (lpcs) == -1)
  44.         return -1;
  45.     
  46.     TEXTMETRIC tm;
  47.     CClientDC dc (this);
  48.     dc.GetTextMetrics (&tm);
  49.     m_cxChar = tm.tmAveCharWidth;
  50.     m_cyChar = tm.tmHeight;
  51.     return 0;
  52. }
  53.  
  54. void CMainWindow::OnPaint ()
  55. {
  56.     CPaintDC dc (this);
  57.                 
  58.     dc.SetWindowOrg (0, m_nScrollPos);
  59.     ShowPenStyles (&dc, m_cxChar * 2, m_cyChar);   
  60.     ShowPenWidths (&dc, m_cxChar * 2, m_cyChar * 15);
  61.     ShowBrushStyles (&dc, m_cxChar * 2, m_cyChar * 27);
  62. }
  63.  
  64. void CMainWindow::OnSize (UINT nType, int cx, int cy)
  65. {
  66.     CFrameWnd::OnSize (nType, cx, cy);
  67.  
  68.     int nScrollMax;
  69.     if (cy < VHEIGHT) {
  70.         nScrollMax = VHEIGHT;
  71.         m_nPageSize = cy;
  72.         m_nScrollPos = min (m_nScrollPos, VHEIGHT - m_nPageSize);
  73.     }
  74.     else
  75.         nScrollMax = m_nScrollPos = m_nPageSize = 0;
  76.  
  77.     SCROLLINFO si;
  78.     si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
  79.     si.nMin = 0;
  80.     si.nMax = nScrollMax;
  81.     si.nPos = m_nScrollPos;
  82.     si.nPage = m_nPageSize;
  83.  
  84.     SetScrollInfo (SB_VERT, &si, TRUE);
  85. }
  86.  
  87. void CMainWindow::OnVScroll (UINT nCode, UINT nPos, CScrollBar* pScrollBar)
  88. {
  89.     int nDelta;
  90.     int nMaxPos = VHEIGHT - m_nPageSize;
  91.  
  92.     switch (nCode) {
  93.  
  94.     case SB_LINEUP:
  95.         if (m_nScrollPos <= 0)
  96.             return;
  97.         nDelta = -(min (m_cyChar, m_nScrollPos));
  98.         break;
  99.  
  100.     case SB_PAGEUP:
  101.         if (m_nScrollPos <= 0)
  102.             return;
  103.         nDelta = -(min (m_nPageSize, m_nScrollPos));
  104.         break;
  105.  
  106.     case SB_THUMBPOSITION:
  107.         nDelta = (int) nPos - m_nScrollPos;
  108.         break;
  109.  
  110.     case SB_PAGEDOWN:
  111.         if (m_nScrollPos >= nMaxPos)
  112.             return;
  113.         nDelta = min (m_nPageSize, nMaxPos - m_nScrollPos);
  114.         break;
  115.  
  116.     case SB_LINEDOWN:
  117.         if (m_nScrollPos >= nMaxPos)
  118.             return;
  119.         nDelta = min (m_cyChar, nMaxPos - m_nScrollPos);
  120.         break;
  121.  
  122.     default: // Ignore other scroll bar messages
  123.         return;
  124.     }
  125.  
  126.     m_nScrollPos += nDelta;
  127.     SetScrollPos (SB_VERT, m_nScrollPos, TRUE);
  128.     ScrollWindow (0, -nDelta);
  129. }
  130.  
  131. void CMainWindow::ShowPenStyles (CDC* pDC, int x, int y)
  132. {
  133.     static struct STYLES styles[] = {
  134.         PS_SOLID,       "PS_SOLID",
  135.         PS_DASH,        "PS_DASH",
  136.         PS_DOT,         "PS_DOT",
  137.         PS_DASHDOT,     "PS_DASHDOT",
  138.         PS_DASHDOTDOT,  "PS_DASHDOTDOT",
  139.         PS_NULL,        "PS_NULL",
  140.         PS_INSIDEFRAME, "PS_INSIDEFRAME"
  141.     };
  142.  
  143.     pDC->SetTextColor (RGB (0, 0, 0));
  144.     pDC->TextOut (x, y, "Pen Styles");
  145.  
  146.     int dy = (m_cyChar * 3) / 2;
  147.     int x1 = x + (m_cxChar * 2);
  148.     int x2 = x + (m_cxChar * 22);
  149.     int x3 = x + (m_cxChar * 46);
  150.  
  151.     CPen* pOldPen;
  152.     pDC->SetTextColor (RGB (255, 0, 0));
  153.  
  154.     for (int i=0; i<7; i++) {
  155.         y += dy;
  156.         pDC->TextOut (x1, y, styles[i].szStyleName);
  157.  
  158.         CPen pen (styles[i].nStyle, 1, RGB (255, 0, 0));
  159.         pOldPen = pDC->SelectObject (&pen);
  160.  
  161.         pDC->MoveTo (x2, y + (m_cyChar / 2));
  162.         pDC->LineTo (x3, y + (m_cyChar / 2));
  163.  
  164.         pDC->SelectObject (pOldPen);
  165.     }
  166. }
  167.  
  168. void CMainWindow::ShowPenWidths (CDC* pDC, int x, int y)
  169. {
  170.     static int nPenWidths[] = { 2, 8, 16, 24 };
  171.  
  172.     pDC->SetTextColor (RGB (0, 0, 0));
  173.     pDC->TextOut (x, y, "Pen Widths");
  174.  
  175.     int dy = m_cyChar * 2;
  176.     int x1 = x + (m_cxChar * 2);
  177.     int x2 = x + (m_cxChar * 22);
  178.     int x3 = x + (m_cxChar * 46);
  179.  
  180.     CPen* pOldPen;
  181.     CString strDescription;
  182.     pDC->SetTextColor (RGB (0, 0, 255));
  183.  
  184.     for (int i=0; i<4; i++) {
  185.         y += dy;
  186.         strDescription.Format ("%d Pixels", nPenWidths[i]);
  187.         pDC->TextOut (x1, y, strDescription);
  188.  
  189.         CPen pen (PS_SOLID, nPenWidths[i], RGB (0, 0, 255));
  190.         pOldPen = pDC->SelectObject (&pen);
  191.  
  192.         pDC->MoveTo (x2, y + (m_cyChar / 2));
  193.         pDC->LineTo (x3, y + (m_cyChar / 2));
  194.  
  195.         pDC->SelectObject (pOldPen);
  196.     }
  197. }
  198.  
  199. void CMainWindow::ShowBrushStyles (CDC* pDC, int x, int y)
  200. {
  201.     static struct STYLES styles[] = {
  202.         HS_BDIAGONAL,   "HS_BDIAGONAL",
  203.         HS_CROSS,       "HS_CROSS",
  204.         HS_DIAGCROSS,   "HS_DIAGCROSS",
  205.         HS_FDIAGONAL,   "HS_FDIAGONAL",
  206.         HS_HORIZONTAL,  "HS_HORIZONTAL",
  207.         HS_VERTICAL,    "HS_VERTICAL"
  208.     };
  209.  
  210.     pDC->SetTextColor (RGB (0, 0, 0));
  211.     pDC->TextOut (x, y, "Brush Styles");
  212.  
  213.     int dy = m_cyChar * 3;
  214.     int x1 = x + (m_cxChar * 2);
  215.     int x2 = x + (m_cxChar * 22);
  216.     int x3 = x + (m_cxChar * 46);
  217.  
  218.     CBrush* pOldBrush;
  219.  
  220.     for (int i=0; i<6; i++) {
  221.         y += dy;
  222.         pDC->TextOut (x1, y, styles[i].szStyleName);
  223.  
  224.         CRect rect (x2, y - m_cyChar, x3, y + m_cyChar);
  225.         CBrush brush (styles[i].nStyle, RGB (0, 255, 0));
  226.  
  227.         CPoint point (rect.left, rect.top);
  228.         pDC->LPtoDP (&point);
  229.         point.x %= 8;
  230.         point.y %= 8;
  231.         pDC->SetBrushOrg (point);
  232.  
  233.         pOldBrush = pDC->SelectObject (&brush);
  234.         pDC->Rectangle (rect);
  235.  
  236.         pDC->SelectObject (pOldBrush);
  237.     }
  238.  
  239.     y += dy;
  240.     pDC->TextOut (x1, y, "Solid");
  241.  
  242.     CBrush brush (RGB (0, 255, 0));
  243.     pOldBrush = pDC->SelectObject (&brush);
  244.     pDC->Rectangle (x2, y - m_cyChar, x3, y + m_cyChar);
  245.     pDC->SelectObject (pOldBrush);
  246. }
  247.